package sessions;

import java.util.ArrayList;
import java.util.Date;
import java.util.Hashtable;
import java.util.List;

import javax.ejb.Stateless;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import entities.Abilita;
import entities.RichiestaAiuto;
import entities.Utente;

@Stateless
public class RichiestaAiutoManager implements RichiestaAiutoManagerRemote{
	@PersistenceContext(unitName = "SwimDB")
	EntityManager database;

	public List<RichiestaAiuto> getRichiestaAiutoInviate(String userName)
	{
		Hashtable<String,String> env = new Hashtable<String,String>();
		env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
		env.put(Context.PROVIDER_URL,"localhost:1099");
		InitialContext jndiContext;
		List <RichiestaAiuto> richieste=new ArrayList<RichiestaAiuto>();
		try {
			jndiContext = new InitialContext(env);

			Object ref = jndiContext.lookup("UserManager/local");
			UserManagerLocal u= (UserManagerLocal) ref;

			Utente utente=u.getUserWithUsername(userName);

			Query q = database.createQuery("FROM RichiestaAiuto u WHERE u.mittente=?1");
			q.setParameter(1, utente);
			List<?> risultato =  q.getResultList();
			for(Object obj: risultato) {
				richieste.add((RichiestaAiuto) obj);
			}
		} catch (NamingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return richieste;
	}

	public List<RichiestaAiuto> getRichiestaAiutoRicevute(String userName)
	{
		List <RichiestaAiuto> richieste=new ArrayList<RichiestaAiuto>();
		Hashtable<String,String> env = new Hashtable<String,String>();
		env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
		env.put(Context.PROVIDER_URL,"localhost:1099");
		InitialContext jndiContext;

		try {
			jndiContext = new InitialContext(env);

			Object ref = jndiContext.lookup("UserManager/local");
			UserManagerLocal u= (UserManagerLocal) ref;

			Utente utente=u.getUserWithUsername(userName);

			Query q = database.createQuery("FROM RichiestaAiuto u WHERE u.destinatario=?1");
			q.setParameter(1, utente);
			List<?> risultato =  q.getResultList();
			for(Object obj: risultato) {
				richieste.add((RichiestaAiuto) obj);
			}

		} catch (NamingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return richieste;
	}
	public void inserisciRichiestaAiuto(String mittente, String destinatario,String abilita, String descrizione) {

		Hashtable<String,String> env = new Hashtable<String,String>();
		env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
		env.put(Context.PROVIDER_URL,"localhost:1099");
		InitialContext jndiContext;


		try {
			jndiContext = new InitialContext(env);

			Object ref = jndiContext.lookup("UserManager/local");
			UserManagerLocal u= (UserManagerLocal) ref;

			Object ref2=jndiContext.lookup("AbilitaManager/local");
			AbilitaManagerLocal a= (AbilitaManagerLocal) ref2;

			Abilita ab=a.getEntityAbilita(abilita);	

			Utente mit=u.getUserWithUsername(mittente);
			Utente dest=u.getUserWithUsername(destinatario);
			RichiestaAiuto richiesta=new RichiestaAiuto();

			richiesta.setMittente(mit);
			richiesta.setDestinatario(dest);
			richiesta.setAbilitaRef(ab);
			Date d=new Date();
			richiesta.setData(d);
			richiesta.setDescrizione(descrizione);
			richiesta.setResponso("NonValutata");
			database.persist(richiesta);

		} catch (NamingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}




	}

	@Override
	public void rispondiAiuto(long IDRichiestaAiuto, boolean responso, String risposta) {
		
		
		RichiestaAiuto r=database.find(RichiestaAiuto.class, IDRichiestaAiuto);
		r.setRisposta(risposta);
		if(responso){
			r.setResponso("Accettata");
		}
		else
		{
			r.setResponso("Rifiutata");
		}
		database.persist(r);
		
		
	}

	@Override
	public void assegnaFeedback(long richiesta, int feedback) {
		RichiestaAiuto ric=database.find(RichiestaAiuto.class,richiesta);
		ric.setFeedback(feedback);
		database.persist(ric);
	}

	@Override
	public void eliminaRichiesta(long richiesta) {

		RichiestaAiuto ric=database.find(RichiestaAiuto.class, richiesta);
		database.remove(ric);
	}

	@Override
	public RichiestaAiuto getEntityRichiesta(long richiesta) {
		return database.find(RichiestaAiuto.class, richiesta);
	}



}
